package com.ruoyi.urule.service.impl;

import com.bstek.urule.console.database.manager.group.GroupManager;
import com.bstek.urule.console.database.manager.group.role.GroupRoleManager;
import com.bstek.urule.console.database.manager.user.UserManager;
import com.bstek.urule.console.database.model.Group;
import com.bstek.urule.console.database.model.GroupRole;
import com.bstek.urule.console.database.model.Role;
import com.bstek.urule.console.security.entity.DefaultUser;
import com.bstek.urule.console.security.entity.User;
import com.bstek.urule.console.security.provider.SecurityProvider;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.exception.user.UserNoneLoginException;
import com.ruoyi.common.utils.ShiroUtils;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.List;

/**
 * 登录集成
 */
@Service(SecurityProvider.BEAN_ID)
public class DefaultSecurityProvider implements SecurityProvider {

	/**
	 * 获取登录用户对象
	 * @param req HttpServletRequest
	 * @return 返回用户对象
	 */
	@Override
	public User getLoginUser(HttpServletRequest req) {
		DefaultUser user =null;
		SysUser loginUser=ShiroUtils.getSysUser();//获取ruoyi框架的登录用户
		if(loginUser!=null){
			// FIXME 用户绑定的团队groups不能为空值，否则会报权限不足
			String userName=loginUser.getLoginName();
			String cName=loginUser.getUserName();
			com.bstek.urule.console.database.model.User user2= UserManager.ins.get(userName);
			if(user2==null){
				// 当本地urule库不存在该用户信息时就自动创建，为空时是不影响登录认证
				user2=new com.bstek.urule.console.database.model.User();
				user2.setId(userName);
				user2.setName(cName);
				user2.setPassword("111111");
				UserManager.ins.add(user2);
			}
			List<Group> groups = GroupManager.ins.createQuery().list(userName);
			// 用户绑定的团队groups不能为空值，否则会报权限不足
			if (groups == null || groups.size() == 0) {
				// 不存在团队就添加到默认团队中
				groups = createGroups(userName, loginUser.getUserName());
			}
			//注意：DefaultUser没有默认的构造方法
			user = new DefaultUser(loginUser.getLoginName(), loginUser.getUserName(), groups);
			req.getSession().setAttribute("urule.user", user);//放到session中
		}else{
			// FIXME 没有正常匹配到用户，需要跳转到认证中心登录页面...
			throw new UserNoneLoginException();
		}
		return  user;
	}
	/**
	 * 查询用户关联的团队，没有就加入到默认团队中
	 * @param userName 用户登录id
	 * @param cName 用户中文名
	 * @return
	 */
	private List<Group> createGroups(String userName, String cName) {
		List<Group> groups;
		String groupId = "default-group";
		Group defaultGroup = GroupManager.ins.get(groupId);
		if (defaultGroup == null) {
			defaultGroup = new Group();
			defaultGroup.setId(groupId);
			defaultGroup.setName("默认团队");
			defaultGroup.setCreateDate(new Date());
			defaultGroup.setCreateUser(userName);
			GroupManager.ins.add(defaultGroup);
			//创建团队角色3个
			GroupRole groupRole = new GroupRole();
			groupRole.setName("Owner");
			groupRole.setType("system");
			groupRole.setGroupId(groupId);
			groupRole.setCreateDate(new Date());
			groupRole.setCreateUser(userName);
			GroupRoleManager.ins.add(groupRole);

			groupRole = new GroupRole();
			groupRole.setName("Manager");
			groupRole.setType("system");
			groupRole.setGroupId(groupId);
			groupRole.setCreateDate(new Date());
			groupRole.setCreateUser(userName);
			GroupRoleManager.ins.add(groupRole);

			groupRole = new GroupRole();
			groupRole.setName("User");
			groupRole.setType("system");
			groupRole.setGroupId(groupId);
			groupRole.setCreateDate(new Date());
			groupRole.setCreateUser(userName);
			GroupRoleManager.ins.add(groupRole);
		}
		GroupManager.ins.addGroupUser(groupId, userName, cName);
		// 查询普通用户角色是否存在？不存在就添到“普通用户”组中
		List<Role> roleList = GroupRoleManager.ins.loadUserRoles(groupId, userName);
		if (roleList.size() == 0) {
			// 用户的'普通角色'不存在，就添加个...默认不到到管理员中
			GroupRole groupRole = GroupRoleManager.ins.get(groupId, "User");
			if (groupRole != null) {
				GroupRoleManager.ins.addUserRole(groupId, userName, groupRole.getId());
			}
		}
		groups = GroupManager.ins.createQuery().list(userName);
		return groups;
	}
	/**
	 * 执行登录操作
	 * @param req HttpServletRequest
	 * @param account 账号
	 * @param password 密码
	 */
	@Override
	public void login(HttpServletRequest req, String account, String password) {
	}

	/**
	 * 执行登出操作
	 * @param req HttpServletRequest
	 */
	@Override
	public void logout(HttpServletRequest req) {
		req.getSession().removeAttribute("urule.user");
	}

}
